/**
 *若(m1,m2)=1,如果x遍历m1的一个完全剩余系，y遍历m2的
 *一个完全剩余系，那么m1y+m2x遍历m1m2的一个完全剩余系。
 */

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int gcb(int x,int y){
	while(y!=0)
		return gcb(y,x%y);
	
	return x;
}

int main(){
	while(true){
		int m1,m2;
		scanf("%d %d",&m1,&m2);
   		int x[m1],y[m2];
		if(gcb(m1,m2)==1){
			srand((unsigned)time(0));
			bool flag=true;
			int num;
			int count1=0,count2=0;
			//生成一个随机的m1完全剩余系
		    while(count1!=m1){
				num=count1+m1*(rand()%100);
				//不重复的随机数
				for(int i=0;i<=count1;i++){
					if(num==x[i]){
						flag=false;
						break;
					}
				}
				if(flag){
					x[count1]=num;
					count1++;
					printf("%d\t",num);
				}
				flag=true;
			}
			printf("\n");
			while(count2!=m2){
				num=count2+m2*(rand()%100);
				for(int i=0;i<=count2;i++){
					if(num==y[i]){
						flag=false;
						break;
					}
				}
				if(flag){
					y[count2]=num;
					count2++;
					printf("%d\t",num);
				}
				flag=true;
			}
			printf("\n");
			//每个m1y+m2x模m1m2两两不同余
			int m=m1*m2;
			for(int i=0;i<m1;i++){
				for(int j=0;j<m2;j++){
					int temp=m1*y[j]+m2*x[i];
					printf("%d(%d)\t",temp,temp%m);
				}
				printf("\n");
			}
		}
		else printf("(m1,m2)/=1\n");
	}
	
}
